package com.geekbang.waitnotify.producerconsumer;

import java.util.Queue;

public class Consumer<T> {
    private Queue<T> tasks;

    public Consumer(Queue<T> tasks) {
        this.tasks = tasks;
    }

    public T consume() throws InterruptedException {
        synchronized (tasks) {
            // TODO 如果不用while，用if，会跳出检查
            while (tasks.size() == 0) {
                System.out.println("消费者线程进入等待：" + Thread.currentThread().getName());
                // TODO 刚开始的时候 100 个线程都会进来, 有一个线程wait之后, 会释放锁, 因此 100个都能进入 synchronized 代码块, 进入wait状态
                // >> TODO wait方法会释放monitor
                tasks.wait();
                // ...
                // ...
            }
            T ret = tasks.poll(); // TODO 拿出队列中的第一个元素
            // >> TODO 调用notify或者notifyAll的时候，必须已经获得对象的monitor，也就是在对象的synchronized块中
            tasks.notifyAll(); // TODO 对应的是 producer 那边的wait
            return ret;
        }
    }
}
